<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>对象</title>
    <link rel="shortcut icon " type="images/x-icon" href="../../css/favicon_logosc2/favicon.ico">
</head>

<body>

    <script>
        /* 
        一、创建对象的三种方法：
            1. new Object()
            2. 字面量()
            3. 构造函数
              function Person(){

              }
              var p1 = new Person()

        二、增删改查
              1. 增加属性
                obj.属性名 = 属性值
                obj.['属性名'] = 属性值

                注意：属性名命名规范同变量的命名，比变量命名要松散，

                增加方法：
                    obj.say = function(){}

              2. 删
                delete obj.属性名
                delete obj[‘属性名]

              3. 改
                obj.属性名 = 属性的新值
                obj[属性名] = 属性的新值

              4. 查
                obj.属性名
                obj['属性名']

              5. 遍历
                for(var key in obj){
                    console.log(key); // 属性名
                    console。log(obj[key]); // 属性值
                }

              6. 调用方法
                obj.方法名()
        */

        var arr = [] //定义数组
        console.log(arr instanceof Array); // 判断数组
        console.log(arr instanceof Object); // 判断是否是对象

        // 创建对象
        var obj = new Object();
        console.log(obj); // {}

        var obj = {}; // 常用创建方法
        console.log(obj); // {}

        // 添加属性 和 方法 --- 增
        // obj.属性名 = 属性值;
        obj.name = '孔明';
        console.log(obj); // {name:'孔明'}
        obj.age = 25;
        console.log(obj); // {name:'孔明',age:18}

        // 特殊:  obj[属性名]; 范围广
        obj['sex'] = '男'
        obj['#lala'] = '拉拉'
        var a = 'year' // 变量
        obj[a] = '公元前221' // 属性名是 变量 的话,不能加引号
        console.log(obj); // {name: '孔明', age: 25, sex: '男', year: '公元前221', #lala: '拉拉'}

        // 增加方法
        obj.shuxing = function () {
            console.log(obj.name + '运筹帷幄');
        }
        obj.shuxing();

        // 删
        delete obj.sex;
        delete obj['#lala']
        console.log(obj);// {name: '孔明', age: 25, year: '公元前221', shuxing: ƒ}

        // 改
        obj.age = 30;
        obj['no'] = '22101'
        console.log(obj); // {name: '孔明', age: 30, year: '公元前221', no: '22101', shuxing: ƒ}

        // 查
        console.log(obj.name, obj.age, obj.sex);// 孔明 30 undefined
        // 如果象中没有属性 打印 undefined 不报错



        // 检测 age 是否在 对象中
        //  如果age属性值为 0 false null 检测结果依然为 false 
        if (obj['age']) {
            console.log('有age属性');
        } else {
            console.log('没有age属性');
        }

        if (obj.hasOwnProperty['age']) {
        // hasOwnProperty 可以确保属性属于obj，而不属于它的原型链，并且它还涵盖了age设置为false、0或null的情况。
            console.log('有age属性');
        } else {
            console.log('没有age属性');
        }
        

        // 变量删除不掉
        var str = 'hello';
        delete str;// 删不掉变量
        console.log(str);



        //  如何判断某个属性是否属于某个对象   可以用 属性名 in  对象
        console.log('d' in obj);//false
        console.log('name' in obj);//true
        console.log(a in obj);//true

        
        // 遍历 对象
        // for(... in ...0)  不能用普通的 for循环  对象没有 length 属性
        console.log(obj,obj.length);
        // {name: '孔明', age: 30, year: '公元前221', no: '22101', shuxing: ƒ} undefined

        // 对象中的属性的值,表现形式是  键值对/名值对
        //  for(var key in obj){

        //  }
        for (var key in obj) {
            console.log(key,obj[key]);// 属性名  值
        }
    </script>
</body>

</html>